

//Observer 类
//构建一个类我们就要想这个类到底如何实例化
// 将一个正常的object转换为每个层级的属性都是相应式的
function addScript(url){
	document.write("<script language=javascript src="+url+"></script>");
}
function defineReactiveUrl(url){
	document.write("<script language=javascript src="+url+"></script>");
}

function arrayUrl(url){
	document.write("<script language=javascript src="+url+"></script>");
}

function depUrl(url){
	document.write("<script language=javascript src="+url+"></script>");
}


addScript('./utils.js')
defineReactiveUrl('./defineReactive.js')
arrayUrl('./array.js')
// depUrl('./Dep.js')

 class Observer {
      //这个value很有可能就是最外面对象
     constructor(value){
        
        //每一个observer的实例身上都有一个dep  所以每一层都有一个Dep
        this.dep=new Dep() //绑到__ob__上
         //给实例 一定要注意 构造函数中的this 不是表示类本身  而是表示实例
        // value.__ob__
        def(value,'__ob__',this,false)//到时把这行代码去掉试试 看行不行
        //上面的this 相当于给实例添加了一个__ob__属性  值时这次new的实例
       // console.log('我是observer构造器',value)
        // console.log('this this'+JSON.stringify(this))
        if(Array.isArray(value)){
            Object.setPrototypeOf(value, arrayMethods);
            // 早期实现是这样
            // value.__proto__ = arrayMethods;
            // observe数组
            this.observeArray(value);

        }else{
            this.walk(value)
        }
     }
     //遍历value对象的每一个key  把每一个key都设置成defineReactive
     walk(value){
        // console.log('kkkkkk')
        // console.log(value)
        // console.log('kkkkkk')
         for(let k in value){
            //  console.log('mmm')
            //  console.log(k)
            //  console.log('mmm')
             defineReactive(value,k)

         }
     }
      // 数组的遍历方式
    observeArray(arr) {
        for (let i = 0, l = arr.length; i < l; i++) {
           // 逐项进行observe
           observe(arr[i]);
        }
    }
}